#ifndef _REFINEMENT_INDIE
#define _REFINEMENT_INDIE

class rINDIEHypothesis : public Hypothesis {
public:

	rINDIEHypothesis() : Hypothesis() {};
	rINDIEHypothesis(rINDIEHypothesis *h);

	bool learn(List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	bool learn_single_class(FeatureTerm *solution,List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	void INDIE(FeatureTerm *description,FeatureTerm *solution,List<FeatureTerm> *positive,List<FeatureTerm> *negative,int heuristic,Ontology *o,FTKBase *domain_model);

	bool learn2c(List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	bool learn2c_single_class(FeatureTerm *solution,List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	void INDIE2C(FeatureTerm *description,FeatureTerm *solution,List<FeatureTerm> *positive,List<FeatureTerm> *negative,int heuristic,Ontology *o,FTKBase *domain_model);

	bool learn2h(List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	bool learn2h_single_class(FeatureTerm *solution,List<FeatureTerm> *cases,Path *description_path,Path *solution_path,Ontology *o,FTKBase *domain_model,int heuristic);
	void INDIE2H(FeatureTerm *description,FeatureTerm *solution,List<FeatureTerm> *positive,List<FeatureTerm> *negative,int heuristic,Ontology *o,FTKBase *domain_model);
	
	FeatureTerm *generalize_pattern(FeatureTerm *pattern,List<FeatureTerm> *positive,List<FeatureTerm> *negative,Ontology *o,FTKBase *domain_model);

//	FeatureTerm *solve_problem(FeatureTerm *problem,FTKBase *domain_model);
	/*
	List<FeatureTerm> m_patterns;
	List<FeatureTerm> m_solutions;
	List<float> m_reliability;
	FeatureTerm *m_default_solution;
	*/
};

#endif

